function Vue(options) {
  var data = options.data();
  observe(data); // 变成响应式数据
  var methods = options.methods;
  Object.defineProperty(this, "a", { // 简单的代理，对属性和computed也做了类似的处理
    get() {
      return data.a;
    },
    set(val) {
      data.a = val;
    },
  });

  // 属性其实保存在一个私有属性_props上，他是一个响应式的对象

  Object.entries(methods).forEach(([methodName, fn]) => {
    this[methodName] = fn.bind(this); // 绑定this
  });

  var updateComponent = () => {
    this._update(this._render()); // 这个里面要做的事情很多
  };

  new Watcher(updateComponent);  // 创建watcher，响应式数据变化，重新运行watcher
}

new Vue(vnode.componentOptions); // 组件实例创建，会传入vnode.componentOptions，应该还会传入组件配置对象，是VueComponent
